home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / dignet / docs / dignet.doc next >
Text File  |  1997-03-29  |  38KB  |  1,483 lines

  1. TABLE OF CONTENTS
  2.  
  3. dignet.library/---resourcetracking---
  4. dignet.library/AbortNet
  5. dignet.library/AllocNet
  6. dignet.library/CallModemDP
  7. dignet.library/CallModemDT
  8. dignet.library/ConvertModemString
  9. dignet.library/FlushNet
  10. dignet.library/FreeNet
  11. dignet.library/GetBaudrate
  12. dignet.library/GetCurrentDevice
  13. dignet.library/GetCurrentUnit
  14. dignet.library/GetIOmsg
  15. dignet.library/GetModemStatus
  16. dignet.library/GetNetport
  17. dignet.library/HangupModem
  18. dignet.library/InitIOEXT
  19. dignet.library/InitModem
  20. dignet.library/ObtainNet
  21. dignet.library/ParseConnect
  22. dignet.library/QueryNet
  23. dignet.library/ReadIOEXT
  24. dignet.library/ReadNet
  25. dignet.library/ReadString
  26. dignet.library/RTAbort
  27. dignet.library/RTCheck
  28. dignet.library/RTFlush
  29. dignet.library/RTHighestID
  30. dignet.library/RTKillNet
  31. dignet.library/RTNetInfo
  32. dignet.library/RTNumberofNets
  33. dignet.library/SetBaud
  34. dignet.library/SetDefault
  35. dignet.library/StopWaiting
  36. dignet.library/Timeout
  37. dignet.library/WriteNet
  38. dignet.library/WriteString
  39.  
  40.  
  41. dignet.library/---resourcetracking---   dignet.library/---resourcetracking---
  42.  
  43.  
  44.   In dignet.library version 3+ you will find special functions for resource
  45.   tracking. All functions that has something to do with resource tracking
  46.   begine with the lettes RT. They are not within the safty net as the other
  47.   functions are so you should be very careful when using those.
  48.  
  49.   You can now create your own RT tools for the dignet.library
  50.  
  51.   NOTE:
  52.  
  53.   You should not use these functions as an replacement for the ordinary
  54.   functions. The arguments is NOT compatible. They should only be used for
  55.   debug reasons. If you don't know what you're doing you are more or less
  56.   guaranteed a system crash. You have been warned.
  57.  
  58.   PROCEDURE:
  59.  
  60.   You should always use the RTCheck() function first. If this function return
  61.   FALSE there is a mismatch in the resource list and alloclist. The system is
  62.   unstable.
  63.  
  64.   If RTCheck() return TRUE you should check how many nets are available with
  65.   the RTNumberOfNets(). If null exit. Alternativly and recommended you could
  66.   use the RTHighestID() to find the highest net ID used.
  67.  
  68.   Then you should use the RTNetInfo() and check parse the list until you get
  69.   to the highest ID (maximum 1024). If the DNRT_TASKSTATUS is FALSE you have
  70.   resources that you can free.
  71.  
  72.   You can then use RTKillNet() on the current ID number or dump information
  73.   to a console or file.
  74.  
  75.   You can use RTAbortNet(), RTFlushNet and RTNetInfo() on a healthy task.
  76.  
  77. dignet.library/AbortNet                               dignet.library/AbortNet
  78.  
  79. NAME
  80.     AbortNet -- aborts the device's IO
  81.  
  82. SYNOPSIS
  83.  
  84.     error=AbortNet(net)
  85.                    a0
  86.  
  87.     ULONG AbortNet(APTR);
  88.  
  89.  
  90. FUNCTION
  91.     This function will abort the iorequests at the device. All iorequests are
  92.     stopped immediatly. Read the serial.doc for more information on how this
  93.     works.
  94.  
  95.     From version 3 this function doesn't flush the net any longer. Use the
  96.     FlushNet() function for that.
  97.  
  98. INPUTS
  99.     net - ptr. to a valid net structure
  100.  
  101. RESULTS 
  102.     error - return null or an errorcode
  103.  
  104. NOTES
  105.     From version 3 this function no longer flushes the net.
  106.  
  107. EXAMPLE
  108.     
  109. BUGS
  110.     
  111. SEE ALSO
  112.     FlushNet(), serial.doc
  113.  
  114. dignet.library/AllocNet                               dignet.library/AllocNet
  115.  
  116. NAME
  117.     AllocNet -- Allocates a private structure to use with the other functions
  118.  
  119. SYNOPSIS
  120.  
  121.     net=AllocNet(devicename,unit)
  122.                  a1         d0
  123.  
  124.     APTR AllocNet(STRPTR,UWORD);
  125.  
  126.  
  127. FUNCTION
  128.     To use any of the functions in this library you need to allocate a net
  129.     structure. This structure is private. The structure information is needed
  130.     for the other functions to know where and what to read/write. It also
  131.     allocates memory to use with IOEXT, message structures and so on.
  132.     Additionally the device get flushed and aborted at startup to make a clean
  133.     start for user. When this function returns true you are ready to use the
  134.     device (Note: opposite of a OpenDevice() call).
  135.  
  136.     CHANGES: From version 3 of this library this function no longer inits the
  137.     device with a default setting (see SetDefault()). That means it use the
  138.     setup you have defined in the serial preference program on your system.
  139.     However if you find it difficult to configure it correctly you could use
  140.     the SetDefault() function to set the device to a "safe" setup which
  141.     supports highspeed and 8-bits transfers.
  142.  
  143. INPUTS
  144.     devicename - ptr. to the device name you want to open [0]
  145.     unit - unit number
  146.  
  147. RESULTS 
  148.     net - ptr. to a private structure or NULL if any errors.
  149.  
  150. NOTES
  151.     NOTE: Devices returns NULL when succeeded. This library function will not
  152.     reflect this result. It will return NULL only if a failure occured such
  153.     as out of memory or the port couldn't be created or the device couldn't
  154.     be opened. There is currently no way within the library to find the exact
  155.     cause of the problem.
  156.  
  157.     However, most other functions in this library returns NULL when things
  158.     went well since they reflect the io_error field. Keep this in mind!
  159.  
  160.     NOTE WELL: Max length of taskname and device name is 127 (including the
  161.     null byte termination).
  162.  
  163.     Max open nets is currently 1024 (normally you use 1).
  164.  
  165. EXAMPLE
  166.  
  167. From C -
  168.     Net=AllocNet("serial.device",0)
  169.  
  170. From Assembler -
  171.     move.l    DignetBase,a6        ;library base in a6
  172.     lea    DeviceName,a0        ;device name in a0
  173.     moveq    #0,d0            ;unit number in d0
  174.     jsr    _LVOAllocNet(a6)    ;call function
  175.     move.l    d0,Net            ;store pointer
  176.     beq    Error            ;if null go to error handling
  177.  
  178. BUGS
  179.     An exact cause of an error should be implemented.
  180.  
  181. SEE ALSO
  182.     FreeNet(), SetDefault()
  183.  
  184.  
  185. dignet.library/CallModemDP                         dignet.library/CallModemDP
  186. dignet.library/CallModemDT                         dignet.library/CallModemDT
  187.  
  188. NAME
  189.     CallModem -- Do the dialup and check procedure for you when dealing with
  190.                  modems (version 3).
  191.  
  192. SYNOPSIS
  193.  
  194.     baud=CallModemDP(net,number,buffer)
  195.                    a0  a1     a2
  196.  
  197.     ULONG CallModemDP(APTR, STRPTR, APTR);
  198.  
  199.  
  200.  
  201.     baud=CallModemDT(net,number,buffer)
  202.                    a0  a1     a2
  203.  
  204.     ULONG CallModemDT(APTR, STRPTR, APTR);
  205.  
  206.  
  207. FUNCTION
  208.     These functions will do the whole procedure for you to dial up a number,
  209.     check the result and return the connect rate. If successful CONNECT the
  210.     functions return the baudrate. If NULL is returned you should check your
  211.     buffer. It will contain what the modem returned such as "NO CARRIER",
  212.     "NO ANSWER", "BUSY", "NO DIALTONE", "ERROR", VOICE", "DELAYED" etc.
  213.     "CONNECT ..." is the only valid return string for these functions to make
  214.     them return true. The baudrate is extracted from the connect string.
  215.     Internally they use the ParseConnect() to get the baud rate, but they
  216.     copy the string first since ParseConnect() makes the buffer invalid.
  217.     Your buffer is due to the internal copy valid after this call and you can
  218.     use the ParseConnect() on it if you need to.
  219.  
  220.     If you want to use touch tone dial you can use CallModemDT(). If you of
  221.     some reason need pulse dial, call the CallModemDP(). The functions are
  222.     compatible and you should let the user of your program deside which one
  223.     to use. CallModemDT() is the most common function to call.
  224.  
  225.     The functions has 30 second timeout limit. If no answer to the dialup is
  226.     received within 30 seconds or something locks up, the functions will
  227.     return with error.
  228.  
  229.     Currently there is no way to terminate a dialup in progress from the
  230.     library. You can however call the HangupModem() anytime to break the dial
  231.     or to hangup a connection.
  232.  
  233. INPUTS
  234.     net    - ptr. to a valid net structure
  235.     number - null terminated string that contains the number to dial,
  236.              f.ex. "12345678"[0]
  237.     buffer - ptr. to a buffer to contain the result. Must be minimum 16
  238.              bytes.
  239.  
  240. RESULTS 
  241.     baud - the baudrate at connect or NULL if any error. Check your buffer if
  242.            NULL is returned.
  243.  
  244. NOTES
  245.     
  246. EXAMPLE
  247.  
  248.     move.l    Net(pc),a0
  249.     lea    number(pc),a1
  250.     lea    buffer(pc),a2
  251.     Call    CallModemDT
  252.     move.l    d0,Baud
  253.     beq    .error
  254. [...]
  255.  
  256. number    dc.b    "12345678",0
  257. Buffer    dcb.b    16,0
  258.  
  259. BUGS
  260.     You should have a possibility to terminate a dialup in progress before
  261.     the phone in the other end picks up the line. You can with having a
  262.     subtask sending a HangupModem(), but this isn't reliable timewise.
  263.  
  264. SEE ALSO
  265.     HangupModem(), ParseConnect()
  266.  
  267. dignet.library/ConvertModemString           dignet.library/ConvertModemString
  268.  
  269. NAME
  270.     ConvertModemString -- convert a standard modem string to binary/ascii
  271.        (version 3)
  272.  
  273. SYNOPSIS
  274.  
  275.     newstring=ConvertModemString(string)
  276.                                  a0
  277.  
  278.     STRPTR ConvertModemString(STRPTR);
  279.  
  280.  
  281. FUNCTION
  282.     This function converts strings used for modem such as "ATZ\r" to its
  283.     binary meaning. "ATZ\r" would become "ATZ"(13) in this example.
  284.     The function uses the same string buffer as you gave because a convertion
  285.     will always make the string shorter than the original string. It also
  286.     nullterminates the new string. If you allocated the string you should use
  287.     the original length to deallocate the new string.
  288.  
  289.     Currently this function only supports these C-style string commands:
  290.  
  291.     \b - backspace
  292.     \e - escape
  293.     \f - form feed
  294.     \n - linefeed
  295.     \r - carriage return
  296.     \t - tabulator
  297.  
  298.     The string you provide can contain binary codes as well. It only converts
  299.     "\*"-sequences and stops only when it finds a null byte.
  300.  
  301. INPUTS
  302.     string - ptr. to a string you want to send the modem
  303.  
  304. RESULTS 
  305.     newstring - ptr. to the converted string (same address as the string you
  306.                 provided with the function). NOTE: If string is unchanged you
  307.                 should check the string ptr. you gave or the string content.
  308.                 It will exit if a0=null
  309.  
  310. NOTES
  311.     
  312. EXAMPLE
  313.  
  314.     NewString=ConvertModemString("ATZ\r")
  315.  
  316.         NewString <- ATZ(13)(0)
  317.     
  318. BUGS
  319.     
  320. SEE ALSO
  321.     InitModem()
  322.  
  323. dignet.library/FlushNet                               dignet.library/FlushNet
  324.  
  325. NAME
  326.     FlushNet -- Flushes the net buffers. Useful with AbortNet() (version 3)
  327.  
  328. SYNOPSIS
  329.  
  330.     error=FlushNet(net)
  331.                    a0
  332.  
  333.     ULONG FlushNet(APTR);
  334.  
  335.  
  336. FUNCTION
  337.     This function flushes the IO buffers used by a net. It's useful after you
  338.     AbortNet() a net to clean up garbage retuned on the port buffers. From
  339.     version 3 the function als have a safty routine after a flush. It reads
  340.     the net for garabge and put it to a nil function of the library. That
  341.     should guarantee pretty much that when this function returns the buffer
  342.     is empty.
  343.  
  344. INPUTS
  345.     net - ptr. to a valid net structure
  346.  
  347. RESULTS 
  348.     error - NULL if ok, io_error otherwise
  349.  
  350. NOTES
  351.     
  352. EXAMPLE
  353.     
  354. BUGS
  355.     
  356. SEE ALSO
  357.     AbortNet()
  358.  
  359. dignet.library/FreeNet                                 dignet.library/FreeNet
  360.  
  361. NAME
  362.     FreeNet -- Frees and cleanup the structure allocated with AllocNet()
  363.  
  364. SYNOPSIS
  365.  
  366.     error=FreeNet(net)
  367.             a0
  368.  
  369.     LONG FreeNet(APTR);
  370.  
  371.  
  372. FUNCTION
  373.     This function will free the structure allocated with AllocNet(). It will
  374.     also flush, abort, wait and close the device and then free memory
  375.     allocated with AllocNet().
  376.  
  377.     From version 2.1 this function now returns an error code. Null if ok, -1
  378.     (DNETERROR_WRONGNET) if you tried to free a net structure that had wrong
  379.     pointer. The error result is for debug purposes. You use it optionally,
  380.     but you should test it before a public release.
  381.  
  382.     If you get this error you gave it the wrong net structure pointer or the
  383.     net was already freed once.
  384.  
  385.     This feature is a bi-effect of the resource capabillity of the library
  386.     implemented in version 2.1.
  387.  
  388. INPUTS
  389.     net - ptr. to a valid net structure
  390.  
  391. RESULT
  392.     error - null if ok, dneterror_wrongnet if wrong net structure was tried
  393.             to get freed.
  394.  
  395. EXAMPLE
  396.     error=FreeNet(net)
  397.  
  398. NOTES
  399.     From version 2.1 this function returns an error code.
  400.  
  401. BUGS
  402.     
  403. SEE ALSO
  404.     AllocNet()
  405.  
  406.  
  407. dignet.library/GetBaudrate                         dignet.library/GetBaudrate
  408.  
  409. NAME
  410.     GetBaudrate -- Returns the current initialized baudrate (version 3)
  411.  
  412. SYNOPSIS
  413.  
  414.     baudrate=GetBaudrate(net)
  415.                          a0
  416.  
  417.     ULONG GetBaudrate(APTR);
  418.  
  419.  
  420. FUNCTION
  421.     This function returns the currently used baudrate from the device. This
  422.     is not neccesarly the same baud speed as the modem connect with. However
  423.     the baud speed should be as high as possible.
  424.  
  425. INPUTS
  426.     net - ptr. to a valid net structure
  427.  
  428. RESULTS 
  429.     baudrate - usigned long integer with the device baud rate or NULL if
  430.                error
  431.  
  432. NOTES
  433.     It does not reflect the connect speed if you use the net with a modem.
  434.     See the ParseConnect() to obtain connect speed.
  435.  
  436. EXAMPLE
  437.     
  438. BUGS
  439.     
  440. SEE ALSO
  441.     SetBaud(), SetDefault()
  442.  
  443. dignet.library/GetCurrentDevice               dignet.library/GetCurrentDevice
  444.  
  445. NAME
  446.     GetCurrentDevice -- returns a pointer to device name currently used.
  447.        (version 3)
  448.  
  449. SYNOPSIS
  450.  
  451.     devicename=GetCurrentDevice(net)
  452.                                 a0
  453.  
  454.     STRPTR GetCurrentDevice(APTR);
  455.  
  456.  
  457. FUNCTION
  458.     This function will return a pointer to the name of the device currently
  459.     used by the net. You should NOT change the content of the string. You are
  460.     allowed to copy the string to your own buffer.
  461.  
  462.     The name is correct as long as the net is valid and the above rule is
  463.     followed.
  464.  
  465. INPUTS
  466.     net - ptr. to a valid net structure
  467.  
  468. RESULTS 
  469.     devicename - ptr. to a nullterminated string containing the device name
  470.                  of the device currently beeing used. NULL if error.
  471.  
  472. NOTES
  473.     
  474. EXAMPLE
  475.     
  476. BUGS
  477.     
  478. SEE ALSO
  479.     GetCurrentUnit()
  480.  
  481. dignet.library/GetCurrentUnit                   dignet.library/GetCurrentUnit
  482.  
  483. NAME
  484.     GetCurrentUnit -- Returns unit number of device used (version 3)
  485.  
  486. SYNOPSIS
  487.  
  488.     unit=GetCurrentUnit(net)
  489.                         a0
  490.  
  491.     UWORD GetCurrentUnit(APTR);
  492.  
  493.  
  494. FUNCTION
  495.     This function returns the unit number of the device currently beeing used
  496.     by the net structure. The number is always correct if the net is valid.
  497.  
  498. INPUTS
  499.     net - ptr. to a valid net structure
  500.  
  501. RESULTS 
  502.     unit - unit number or -1 if error
  503.  
  504. NOTES
  505.     
  506. EXAMPLE
  507.     
  508. BUGS
  509.     
  510. SEE ALSO
  511.     GetCurrentDevice()
  512.  
  513. dignet.library/GetIOmsg                               dignet.library/GetIOmsg
  514.  
  515. NAME
  516.     GetIOmsg -- Returns a pointer to the IO msg used (version 3)
  517.  
  518. SYNOPSIS
  519.  
  520.     iomsg=GetIOmsg(net)
  521.                    a0
  522.  
  523.     struct iomsg * GetIOmsg(APTR);
  524.  
  525.  
  526. FUNCTION
  527.     This function returns a pointer to a IOMSG structure used by the device.
  528.     Useful if user want to use the device in a more advanced way.
  529.  
  530. INPUTS
  531.     net - ptr. to a valid net structure
  532.  
  533. RESULTS 
  534.     iomsg - ptr. to a iomsg structure or NULL if error
  535.  
  536. NOTES
  537.     
  538. EXAMPLE
  539.     
  540. BUGS
  541.     
  542. SEE ALSO
  543.     GetNetport()
  544.  
  545.  
  546. dignet.library/GetModemStatus                   dignet.library/GetModemStatus
  547.  
  548. NAME
  549.     GetModemStatus -- Returns a bool of the assumed modem state (version 3)
  550.  
  551. SYNOPSIS
  552.  
  553.     status=GetModemStatus(net)
  554.                           a0
  555.  
  556.     BOOL GetModemStatus(APTR);
  557.  
  558.  
  559. FUNCTION
  560.     This function returns a bool of what it thinks the current modem state
  561.     is. If false the modem is assumed offline, if true the modem is assumed
  562.     to be online. The reason why it has to assume the status if because after
  563.     a successful modem dial the user can turn off the modem and on again. The
  564.     net structure doesn't know about this.
  565.  
  566. INPUTS
  567.     net - ptr. to a valid net structure
  568.  
  569. RESULTS 
  570.     status - BOOL, true if modem is assumed online, false if assumed offline
  571.              You will get FALSE if error.
  572.  
  573. NOTES
  574.     The function only assumes the status, it doesn't know for sure.
  575.  
  576. EXAMPLE
  577.     
  578. BUGS
  579.     Should find a way to check the real status. Some active line or
  580.     something. If some of you know, please report to kenny@bgnett.no
  581.  
  582. SEE ALSO
  583.     CallModem(), HangupModem()
  584.  
  585. dignet.library/GetNetport                           dignet.library/GetNetport
  586.  
  587. NAME
  588.     GetNetport -- Returns the pointer to the msg port used for net (ver 2)
  589.  
  590. SYNOPSIS
  591.  
  592.     port=GetNetport(net)
  593.                     a0
  594.  
  595.     struct MP* GetNetport(APTR);
  596.  
  597.  
  598. FUNCTION
  599.     This function return a pointer to the public message port used by this
  600.     library. You are free to name it. You can with this function use this
  601.     more advanced uses such as collecting port signals and Wait() them.
  602.  
  603.     No need to use this function if you don't require advanced uses.
  604.  
  605. INPUTS
  606.     net - ptr. to a valid net structure
  607.  
  608. RESULTS 
  609.     port - ptr. to a message port (public). NULL if error.
  610.  
  611. NOTES
  612.     After a FreeNet() call the port is invalid!
  613.  
  614. EXAMPLE
  615.     
  616. BUGS
  617.     
  618. SEE ALSO
  619.     GetIOmsg()
  620.  
  621. dignet.library/HangupModem                         dignet.library/HangupModem
  622.  
  623. NAME
  624.     HangupModem -- send break and hangup command to modem (version 3)
  625.  
  626. SYNOPSIS
  627.  
  628.     error=HangupModem(net)
  629.                       a0
  630.  
  631.     ULONG HangupModem(APTR);
  632.  
  633.  
  634. FUNCTION
  635.     This function send the a break and hangup command to the modem. The
  636.     string it sends is "\w\w+++\w\w\w\wATH\r". This is a standard way to
  637.     hangup the modem when online. If you need to hangup the modem otherwise
  638.     you should use the WriteNet() function to write your string to the modem
  639.     that hang it up. The function will use 3.5 seconds on the hangup.
  640.     It also sends the ATH command twice.
  641.  
  642.     You could take a FlushNet() after a HangupModem() call.
  643.  
  644. INPUTS
  645.     net - ptr. to a valid net structure
  646.  
  647. RESULTS 
  648.     error - NULL if OK when sending, io_error otherwise
  649.  
  650. NOTES
  651.     Sending a break and hangup command to the modem does NOT guarantee the
  652.     modem to hang up. You should check the lights on your modem if it really
  653.     hung up.
  654.  
  655. EXAMPLE
  656.     
  657. BUGS
  658.     
  659. SEE ALSO
  660.     WriteNet()
  661.  
  662. dignet.library/InitIOEXT                             dignet.library/InitIOEXT
  663.  
  664. NAME
  665.     InitIOEXT -- Init the IOEXT structure of a device (serial/duart etc.)
  666.  
  667. SYNOPSIS
  668.  
  669.     error=InitIOEXT(net,newIOEXT,size)
  670.                     a0  a1       d0
  671.  
  672.     ULONG InitIOEXT(APTR, APTR *, ULONG);
  673.  
  674.  
  675. FUNCTION
  676.     This function will init the IOEXT and call the device function
  677.     SetParameters. Only use this with devices that are compatible with the
  678.     serial device (for example duart.device).
  679.  
  680.     Always use the ReadIOEXT() first to copy current settings of the device
  681.     to your buffer. This way you only have to change some fields. If not you
  682.     will have to setup the whole IOEXT struture.
  683.  
  684. INPUTS
  685.     net - ptr. to a valid net structure
  686.     newIOEXT - ptr. to new settings (IOEXTSER structure)
  687.     size - number of bytes to copy
  688.  
  689. RESULTS 
  690.     error - reflects the io_error field. Null if ok.
  691.  
  692. NOTES
  693.     For C users: Use struct IOEXTSER *, but you need to add $30 to the
  694.     structure's beginning since this function copy only the IOEXTSER part!
  695.  
  696.     Currently max number of chars to read should be 80 bytes.
  697.     
  698. EXAMPLE
  699.  
  700. BUGS
  701.     Should perhaps used the whole IO stucture to make it more simpler for C
  702.     users.
  703.  
  704. SEE ALSO
  705.     ReadIOEXT(), devices/serial.i|h, dignet/dignet.i|h
  706.  
  707.  
  708. dignet.library/InitModem                             dignet.library/InitModem
  709.  
  710. NAME
  711.     InitModem -- Inits a modem with a standard initstring (version 3)
  712.  
  713. SYNOPSIS
  714.  
  715.     error=InitModem(net,initstring,buffer)
  716.                     a0  a1         a2
  717.  
  718.     ULONG InitModem(APTR,STRPTR,APTR);
  719.  
  720.  
  721. FUNCTION
  722.     The function converts the string and sends it to the net where it expect
  723.     a modem to be. If no modem found it return with either timeout error or
  724.     error code from the io_error field.
  725.  
  726.     A string could be: "ATZ\r"[0] and the function converts this to:
  727.  
  728.         ATZ(13) [13=Carriage Return/CR]
  729.  
  730.     Currently this function only supports these C-style string commands:
  731.  
  732.     \b - backspace
  733.     \e - escape
  734.     \f - form feed
  735.     \n - linefeed
  736.     \r - carriage return
  737.     \t - tabulator
  738.  
  739.     Other commands will be ignored.
  740.  
  741.     The function copies the io_actual error code to result and the string the
  742.     modem replies with to the buffer you provided so you can check or print
  743.     the result (eg. OK or ERROR). Note that the buffer must be atleast 16
  744.     bytes long.
  745.  
  746.     If user provides a init string which dumps much data, this function will
  747.     crop that stream to 16 bytes so it'll fit into the buffer. With correct
  748.     use of the init string the modem should return 3 bytes OK(13).
  749.  
  750. INPUTS
  751.     net - ptr. to a valid net structure
  752.     initstring - ptr. to a nullterminated init string (required from 3.03).
  753.     buffer - ptr. to result buffer (if modem return OK/ERROR). Minimum 16
  754.              bytes long.
  755.  
  756. RESULTS 
  757.     error - NULL if ok, DNETERROR_TIMEOUT if timeout (maybe no modem),
  758.             or io_error in all other cases. You should check the buffer
  759.             in any case.
  760.  
  761. NOTES
  762.     From 3.03 you MUST supply an Initstring in A1 !
  763.  
  764.     The buffer you provide MUST be a minimum of 16 bytes long.
  765.  
  766.     This routine gives the modem 3 seconds to reply. It returns immediatly if
  767.     it receives a reply from the modem.
  768.  
  769. EXAMPLE
  770.     To check the buffer if it is empty or not you could do (from assembler):
  771.  
  772.     lea    Buffer,a0
  773.     tst.b    (a0)
  774.     beq    .empty
  775.  
  776. BUGS
  777.     The function wount accept a NULL pointer in A1 (initstring). I beats us
  778.     since whatever we do the library doesn't handle it. Maybe an assembler
  779.     error ?!
  780.  
  781. SEE ALSO
  782.     CallModem(), ConvertModemString()
  783.  
  784. dignet.library/ObtainNet                             dignet.library/ObtainNet
  785.  
  786. NAME
  787.     ObtainNet -- to share a net from another task (version 3)
  788.  
  789. SYNOPSIS
  790.  
  791.     net=ObtainNet(taskname)
  792.                   a0
  793.  
  794.     APTR ObtainNet(STRPTR);
  795.  
  796.  
  797. FUNCTION
  798.     This function will try to find a net allocated by taskname. If success
  799.     this function will return with a pointer to the netstructure.
  800.  
  801.     NOTE: It's never safe to use the net structure since you don't know if
  802.     the net owner task frees it. You should have very special reasons to use
  803.     this function, probably debug reasons or sub tasks that want to use the
  804.     net. If so control the freeing with flags or similar.
  805.  
  806.     There will maybe be locking functions in future.
  807.  
  808. INPUTS
  809.     taskname - ptr. to a taskname
  810.  
  811. RESULTS 
  812.     net - net structure if success or NULL
  813.  
  814. NOTES
  815.     Use this for special reasons only!
  816.     
  817. EXAMPLE
  818.     
  819. BUGS
  820.     
  821. SEE ALSO
  822.     AllocNet()
  823.  
  824. dignet.library/ParseConnect                       dignet.library/ParseConnect
  825.  
  826. NAME
  827.     ParseConnect -- Converts a connect string to baudrate (version 3)
  828.  
  829. SYNOPSIS
  830.  
  831.     baudrate=ParseConnect(buffer)
  832.                           a0
  833.  
  834.     ULONG ParseConnect(APTR);
  835.  
  836.  
  837. FUNCTION
  838.     This function will try to convert a CONNECT string returned by
  839.     CallModem() in buffer. It then returns the integer value of the connect
  840.     speed (real speed).
  841.  
  842.     If buffer contains error messages or is empty this function will return
  843.     NULL. The buffer is considered invalid after you have used this function
  844.     on it!
  845.  
  846. INPUTS
  847.     buffer - ptr. to the buffer CallModem() returned its connect string.
  848.  
  849. RESULTS 
  850.     baudrate - unsigned long integer containing baudrate or NULL if invalid
  851.                buffer
  852.  
  853. NOTES
  854.     The buffer is considered invalid after you have used this function on it!
  855.     
  856. EXAMPLE
  857.     
  858. BUGS
  859.     
  860. SEE ALSO
  861.     CallModemDT(), CallModemDP()
  862.  
  863. dignet.library/QueryNet                               dignet.library/QueryNet
  864.  
  865. NAME
  866.     QueryNet -- Query the device and return number of chars that are
  867.                 available for read.
  868.  
  869. SYNOPSIS
  870.  
  871.     chars=QueryNet(net)
  872.                    a0
  873.  
  874.     ULONG QueryNet(APTR);
  875.  
  876.  
  877. FUNCTION
  878.     Use this function before you ReadNet() the device. This function will
  879.     return number of bytes that are available to read. You can parse the
  880.     result directly to ReadNet(). If zero bytes the ReadNet() will abort and
  881.     return immediatly.
  882.  
  883. INPUTS
  884.     net - ptr. to a valid net structure
  885.  
  886. RESULTS 
  887.     chars - number of chars available to read
  888.  
  889. NOTES
  890.     
  891. EXAMPLE
  892.     
  893. BUGS
  894.     
  895. SEE ALSO
  896.     ReadNet()
  897.  
  898. dignet.library/ReadIOEXT                             dignet.library/ReadIOEXT
  899.  
  900. NAME
  901.     ReadIOEXT -- Copies current settings in IOEXT to a buffer
  902.  
  903. SYNOPSIS
  904.  
  905.     ReadIOEXT(net,buffer,size)
  906.                a0  a1     d0
  907.  
  908.     void ReadIOEXT(APTR,APTR,ULONG);
  909.  
  910.  
  911. FUNCTION
  912.     This function will copy current setting of the IOEXT structure used to
  913.     for example to set baud rate in the serial device. The device has to be
  914.     compatible with the serial device to read successfully. The reason for
  915.     this is that it reads from an offset that is valid for the serial.device.
  916.     If another device has its IOEXT structure at same offset this function
  917.     and the InitIOEXT() function can be used. Remember to set number of
  918.     bytes to copy.
  919.  
  920. INPUTS
  921.     net - ptr. to a valid net structure
  922.     buffer - ptr. to a buffer to copy to
  923.     size - number of bytes to copy
  924.  
  925. NOTES
  926.     Currently max number of chars to read should be 80 bytes.
  927.  
  928.     DO NOT use devices that are not compatible with the serial.device or
  929.     the IOEXTSER structure!
  930.  
  931. EXAMPLE
  932.     
  933. BUGS
  934.     
  935. SEE ALSO
  936.     InitIOEXT(), devices/serial.i|h, dignet/dignet.i|h
  937.  
  938. dignet.library/ReadNet                                 dignet.library/ReadNet
  939.  
  940. NAME
  941.     ReadNet -- reads x bytes from the device
  942.  
  943. SYNOPSIS
  944.  
  945.     error=ReadNet(net,buffer,size)
  946.                   a0  a1     d0
  947.  
  948.     ULONG ReadNet(APTR,APTR,ULONG);
  949.  
  950.  
  951. FUNCTION
  952.     This function will read from the device. You should first call a query
  953.     function to check the number of bytes waiting and then read those into
  954.     your buffer. If zero bytes this function will abort immediatly so it is
  955.     safe to call it. If you ask for more bytes than are available this
  956.     function will wait until the amount can be read from the port. Use
  957.     AbortNet() to cancel the wait or use Timeout() to give some time to get
  958.     some bytes on the port before a ReadNet() is called. This function reads
  959.     byte-by-byte to not miss any chars from the buffer.
  960.  
  961. INPUTS
  962.     net - ptr. to a valid net structure
  963.     buffer - ptr. to a buffer
  964.     size - number of bytes to read
  965.  
  966. RESULTS 
  967.     error - null if ok, else it reflects the io_error field
  968.  
  969. NOTES
  970.     
  971. EXAMPLE
  972.     error=ReadNet(net,buffer,queryresult|timeoutresult)
  973.  
  974. BUGS
  975.     
  976. SEE ALSO
  977.     WriteNet(), QueryNet(), AbortNet(), Timeout()
  978.  
  979. dignet.library/ReadString                           dignet.library/ReadString
  980.  
  981. NAME
  982.     ReadString -- read a null terminated string from net (version 2)
  983.  
  984. SYNOPSIS
  985.  
  986.     error=ReadString(net,buffer,max)
  987.                      a0  a1     d0
  988.  
  989.     ULONG ReadString(APTR,APTR,ULONG);
  990.  
  991.  
  992. FUNCTION
  993.     This function will read a string until it reaches a null termination byte
  994.     or buffer overflows. Useful with the function WriteString() which sends a
  995.     null terminated string to the net.
  996.  
  997.     CHANGES: if this function returns -1 (from version 2.1) it means buffer
  998.     overflow. You should act on that and continue to read after you have
  999.     cleaned up. Other non-null returns are errors returned from io_error
  1000.     field. Consult the serial.device documentation to get the definitions on
  1001.     those.
  1002.  
  1003. INPUTS
  1004.     net - ptr. to a valid net structure
  1005.     buffer - ptr. to buffer to keep the string
  1006.     max - max length of string
  1007.  
  1008. RESULTS 
  1009.     error - NULL if OK. -1 if buffer overflow, otherwise io_error.
  1010.  
  1011. NOTES
  1012.     NOTE WELL: This function returns -1 from version 2.1. It returned 1 in
  1013.     earlier version, but that could conflict with the dev_busy error (1).
  1014.     Please update your programs. Sorry for the inconvinient.
  1015.  
  1016. EXAMPLE
  1017.     
  1018. BUGS
  1019.     See notes!
  1020.  
  1021. SEE ALSO
  1022.     WriteString(), QueryNet(), Timeout(), AbortNet()
  1023.  
  1024. dignet.library/RTAbort                                 dignet.library/RTAbort
  1025.  
  1026. NAME
  1027.     RTAbort -- Tries to abort an allocated  net (version 3)
  1028.  
  1029. SYNOPSIS
  1030.  
  1031.     RTAbort(ID)
  1032.             d0
  1033.  
  1034.     void RTAbort(ULONG);
  1035.  
  1036.  
  1037. FUNCTION
  1038.     This function will try to abort a net. If the net isn't in use the
  1039.     function will return immediatly. There is no saftcheck on the pointers.
  1040.  
  1041. INPUTS
  1042.     ID - ID of a net
  1043.  
  1044. NOTES
  1045.     
  1046. EXAMPLE
  1047.     
  1048. BUGS
  1049.     
  1050. SEE ALSO
  1051.    RTNetInfo
  1052.  
  1053. dignet.library/RTCheck                                 dignet.library/RTCheck
  1054.  
  1055. NAME
  1056.     RTCheck -- Checks the count list for mismatch (version 3)
  1057.  
  1058. SYNOPSIS
  1059.  
  1060.     status=RTCheck()
  1061.  
  1062.  
  1063.     BOOL RTCheck(void);
  1064.  
  1065.  
  1066. FUNCTION
  1067.     This function check the resource tracklist and the opennet counter for
  1068.     any mismatch. If this function return FALSE there is a mismatch in the
  1069.     count lists. That could mean some net isn't properly killed (invalid
  1070.     pointer was given to RTKillNet() or something like that). If there is a
  1071.     mismatch you have to cleanup manually by finding the net that should be
  1072.     killed and then FreeNet() it. You do so at your own risk!
  1073.  
  1074. RESULTS 
  1075.     status - TRUE if ok, otherwise FALSE and system is in risk.
  1076.  
  1077. NOTES
  1078.     
  1079. EXAMPLE
  1080.     
  1081. BUGS
  1082.     
  1083. SEE ALSO
  1084.     RTNumberofNets()
  1085.  
  1086. dignet.library/RTFlush                                  dignet.library/RTFlush
  1087.  
  1088. NAME
  1089.     RTFlush -- Tries to flush an allocated net (version 3)
  1090.  
  1091. SYNOPSIS
  1092.  
  1093.     RTFlush(ID)
  1094.                d0
  1095.  
  1096.     void RTFlush(ULONG);
  1097.  
  1098.  
  1099. FUNCTION
  1100.     This function will try to flush an allocated net. You should check for
  1101.     the existance of the net by using the RTNetInfo() function first.
  1102.  
  1103. INPUTS
  1104.     ID - ID of a net
  1105.  
  1106. NOTES
  1107.     
  1108. EXAMPLE
  1109.     
  1110. BUGS
  1111.     
  1112. SEE ALSO
  1113.     RTNetInfo()
  1114.  
  1115.  
  1116. dignet.library/RTHighestID                         dignet.library/RTHighestID
  1117.  
  1118. NAME
  1119.     RTHighestID -- Return the highest ID number (version 3)
  1120.  
  1121. SYNOPSIS
  1122.  
  1123.     HighestID=RTHighestID()
  1124.  
  1125.  
  1126.     ULONG RTHighestID(void);
  1127.  
  1128.  
  1129. FUNCTION
  1130.     This function will return the highest ID number available. If there are
  1131.     no nets if will return NULL. This function is useful when you will parse
  1132.     a list.
  1133.  
  1134. RESULTS 
  1135.     HighestID - highest ID number or NULL if no nets are allocated
  1136.  
  1137. NOTES
  1138.     
  1139. EXAMPLE
  1140.     
  1141. BUGS
  1142.     
  1143. SEE ALSO
  1144.     RTNetInfo()
  1145.  
  1146. dignet.library/RTKillNet                             dignet.library/RTKillNet
  1147.  
  1148. NAME
  1149.     RTKillNet -- Tryes to kill an allocated net (version 3)
  1150.  
  1151. SYNOPSIS
  1152.  
  1153.     RTKillNet(ID)
  1154.               d0
  1155.  
  1156.     void RTKillNet(ULONG);
  1157.  
  1158.  
  1159. FUNCTION
  1160.     This function will try to kill an allocated net. You should however use
  1161.     the function RTNetInfo() first to check if the netowener task is in
  1162.     tasklist or not. You shouldn't kill a net that is owned by a healthy
  1163.     task.
  1164.  
  1165.     If the net ID isn't valid the function will return immediatly.
  1166.  
  1167. INPUTS
  1168.     ID - Net ID.
  1169.  
  1170. NOTES
  1171.     DO NOT use this function on a healthy task!
  1172.  
  1173. EXAMPLE
  1174.     
  1175. BUGS
  1176.     
  1177. SEE ALSO
  1178.     RTNetInfo(), RTAbort(), RTFlush()
  1179.  
  1180. dignet.library/RTNetInfo                             dignet.library/RTNetInfo
  1181.  
  1182. NAME
  1183.     RTNetInfo -- Returns vital information about a net ID (version 3)
  1184.  
  1185. SYNOPSIS
  1186.  
  1187.     success=RTNetInfo(buffer,ID)
  1188.                       a0     d0
  1189.  
  1190.     BOOL RTNetInfo(APTR,ULONG);
  1191.  
  1192.  
  1193. FUNCTION
  1194.     This function will copy vital information from the private RT structure
  1195.     in the library to a public structure (see dignet/dignet.i|h). If the net
  1196.     ID isn't valid (eg. isn't used) the function will return immediatly with
  1197.     FALSE in bool.
  1198.  
  1199. INPUTS
  1200.     buffer - ptr. to a buffer that contains the structure (DNRT_SIZEOF)
  1201.     ID - net ID to get info about
  1202.  
  1203. RESULTS 
  1204.     success - TRUE (-1) if success, otherwise FALSE
  1205.  
  1206. NOTES
  1207.     
  1208. EXAMPLE
  1209.     
  1210. BUGS
  1211.     
  1212. SEE ALSO
  1213.     RTHighestID(), RTNumberofNets(), dignet/dignet.i|h
  1214.  
  1215. dignet.library/RTNumberofNets                   dignet.library/RTNumberofNets
  1216.  
  1217. NAME
  1218.     RTNumberofNets -- Returns number of open nets (version 3)
  1219.  
  1220. SYNOPSIS
  1221.  
  1222.     number=RTNumberofNets()
  1223.  
  1224.  
  1225.     ULONG RTNumberofNets(void);
  1226.  
  1227.  
  1228. FUNCTION
  1229.     This function will return number of open nets in the system. You should
  1230.     use the RTCheck to find out any mismatch in the net count and resource
  1231.     trackers counter.
  1232.  
  1233. RESULTS 
  1234.     number - number of nets open
  1235.  
  1236. NOTES
  1237.     This function doesn't return the highest available number of nets. Use
  1238.     the function RTHighestID() to find that out.
  1239.  
  1240. EXAMPLE
  1241.     
  1242. BUGS
  1243.     
  1244. SEE ALSO
  1245.     RTCheck(), RTHighestID()
  1246.  
  1247. dignet.library/SetBaud                                 dignet.library/SetBaud
  1248.  
  1249. NAME
  1250.     SetBaud -- updeates the device with a new baudrate (version 3).
  1251.  
  1252. SYNOPSIS
  1253.  
  1254.     error=SetBaud(net,baud)
  1255.                   a0  d0
  1256.  
  1257.     ULONG SetBaud(APTR,ULONG);
  1258.  
  1259.  
  1260. FUNCTION
  1261.     Use this function to update just the baud rate. The baudrate should be an
  1262.     integer value, for example: baud=38400.
  1263.  
  1264. INPUTS
  1265.     net - ptr. to a valid net structure
  1266.     baud - integer value describing the baud rate.
  1267.  
  1268. RESULTS 
  1269.     error - NULL if OK, otherwise io_error or -1 if a0 or d0 is null.
  1270.  
  1271. NOTES
  1272.     Most devices communciating with the serial port do not support baud rates
  1273.     in a linear way. Read the documentation about which baud rates the device
  1274.     supports.
  1275.  
  1276. EXAMPLE
  1277.     
  1278. BUGS
  1279.     
  1280. SEE ALSO
  1281.     ReadIOExt(), InitIOExt()
  1282.  
  1283. dignet.library/SetDefault                           dignet.library/SetDefault
  1284.  
  1285. NAME
  1286.     SetDefault -- Set default parameters to a "safe" setup (version 3)
  1287.  
  1288. SYNOPSIS
  1289.  
  1290.     error=SetDefault(net)
  1291.                      a0
  1292.  
  1293.     ULONG SetDefault(APTR);
  1294.  
  1295.  
  1296. FUNCTION
  1297.     This function will initialize the modem with considered "safe" settings.
  1298.     the following parameters are set:
  1299.  
  1300.     Buffer size: 8194
  1301.     Flags: 7WIRE + BOGGIE + XDISABLED + NOPARITY.
  1302.     BAUD: 38400 (this is not the connect baud)
  1303.           8 bits per char
  1304.           1 stopbit
  1305.  
  1306.     This setup should work for any Amiga. If you have a slow Amiga (68000 or
  1307.     68010) you should use the SetBaud() function and set baud to 19200. If
  1308.     you have a faster Amiga than 68030/25 Mhz you can set use the SetBaud()
  1309.     function to set 57000 or better. The BOGGIE and 7WIRE make sure that you
  1310.     can accept highspeed transfers. Without those you may get garbage. You
  1311.     can use the ReadIOEXT() and InitIOEXT() to change flags and more.
  1312.  
  1313. INPUTS
  1314.     net - ptr. to a valid net structure
  1315.  
  1316. RESULTS 
  1317.     error - NULL if ok, otherwise io_error
  1318.  
  1319. NOTES
  1320.     
  1321. EXAMPLE
  1322.     
  1323. BUGS
  1324.     
  1325. SEE ALSO
  1326.     SetBaud(), ReadIOEXT(), InitIOEXT()
  1327.  
  1328. dignet.library/StopWaiting                         dignet.library/StopWaiting
  1329.  
  1330. NAME
  1331.     StopWaiting -- Terminates a WaitModem() call (version 3)
  1332.  
  1333. SYNOPSIS
  1334.  
  1335.     StopWaiting(net)
  1336.                  a0
  1337.  
  1338.     void StopWaiting(APTR);
  1339.  
  1340.  
  1341. FUNCTION
  1342.     This function sends a termiate message to the WaitModem() function. The
  1343.     WaitModem() will otherwise never return if it not receive a RING string
  1344.     first. It may take some seconds before the function returns after the
  1345.     terminate message is sent. The buffer should contain "TERMINATED" if this
  1346.     was the reason.
  1347.  
  1348. INPUTS
  1349.     net - ptr. to a valid net structure
  1350.  
  1351. NOTES
  1352.     Calling it with no WaitModem() waiting has no effect and is safe.
  1353.  
  1354. EXAMPLE
  1355.     
  1356. BUGS
  1357.     
  1358. SEE ALSO
  1359.     WaitModem()
  1360.  
  1361. dignet.library/Timeout                                 dignet.library/Timeout
  1362.  
  1363. NAME
  1364.     Timeout -- waits x seconds to receive char(s) on the device for reading
  1365.  
  1366. SYNOPSIS
  1367.  
  1368.     chars=Timeout(net,seconds)
  1369.                   a0  d0
  1370.  
  1371.     ULONG Timeout(APTR,UWORD);
  1372.  
  1373.  
  1374. FUNCTION
  1375.     You can use this function to give a device a certain amont of time to get
  1376.     a char or more on the port for reading. You set seconds to wait. If a
  1377.     char or more is received the function will return with the current amount
  1378.     of chars in buffer. If timeout occure it will return with NULL.
  1379.  
  1380.     Null seconds is valid, however it will just call the QueryNet() function
  1381.     instead and return immediatly.
  1382.  
  1383.     If you lock up waiting for chars with ReadNet() or ReadString() use the
  1384.     AbortNet() function.
  1385.  
  1386. INPUTS
  1387.     net - ptr. to a valid net structure
  1388.     seconds - number of seconds to wait for timeout
  1389.  
  1390. RESULTS 
  1391.     chars - number of chars received before timeout or NULL if none
  1392.  
  1393. NOTES
  1394.     The seconds are divided in smaller parts so the function don't have to
  1395.     wait a whole second to return if there are chars on the buffer.
  1396.  
  1397. EXAMPLE
  1398.     
  1399. BUGS
  1400.     It should use WaitPort() instead of Delay() + Query. Will maybe be fixed
  1401.     in future.
  1402.  
  1403. SEE ALSO
  1404.     QueryNet(), AbortNet()
  1405.  
  1406. dignet.library/WriteNet                               dignet.library/WriteNet
  1407.  
  1408. NAME
  1409.     WriteNet -- Writes x bytes to the device
  1410.  
  1411. SYNOPSIS
  1412.  
  1413.     error=WriteNet(net,buffer,size)
  1414.                    a0  a1     d0
  1415.  
  1416.     ULONG WriteNet(APTR,APTR,ULONG);
  1417.  
  1418.  
  1419. FUNCTION
  1420.     This function write a number of bytes (really a copy) from a buffer of
  1421.     size x. The function returns immediatly.
  1422.  
  1423. INPUTS
  1424.     net - ptr. to a valid net structure
  1425.     buffer - ptr. to a buffer taht contains bytes to write
  1426.     size - number of bytes to write
  1427.  
  1428. RESULTS 
  1429.     error - reflects the io_error field. Null if ok.
  1430.  
  1431. NOTES
  1432.     
  1433. EXAMPLE
  1434.     error=WriteNet(net,buffer,3351)
  1435.  
  1436. BUGS
  1437.     In earlier versions there had to be implemented a delay of 20/50 of a
  1438.     second to get all chars read from the io buffer. This is fixed for
  1439.     the version 2 release. The library now read and writes byte-by-byte to
  1440.     not loose any chars.
  1441.  
  1442. SEE ALSO
  1443.     ReadNet()
  1444.  
  1445. dignet.library/WriteString                         dignet.library/WriteString
  1446.  
  1447. NAME
  1448.     WriteString -- Writes a nullterminated string to net (v.2)
  1449.  
  1450. SYNOPSIS
  1451.  
  1452.     error=WriteString(net,string)
  1453.                       a0  a1
  1454.  
  1455.     ULONG WriteString(APTR,STRPTR);
  1456.  
  1457.  
  1458. FUNCTION
  1459.     This function is pretty similar to WriteNet(). In fact this function
  1460.     is just a pre-function to WriteNet(). It counts the number of chars in
  1461.     the string until zero is found and the calls the WriteNet() function with
  1462.     length as parameter. Read about WriteNet() for more info.
  1463.  
  1464.     The result code is actually returned be WriteNet() and reflects the
  1465.     io_error field. Null if ok.
  1466.  
  1467. INPUTS
  1468.     net - ptr. to a valid net structure
  1469.     string - ptr. to a null-terminated string
  1470.  
  1471. RESULTS 
  1472.     error - reflects the io_error field. Null if ok.
  1473.  
  1474. NOTES
  1475.     
  1476. EXAMPLE
  1477.     
  1478. BUGS
  1479.     
  1480. SEE ALSO
  1481.     ReadString()
  1482.  
  1483.